home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #29 (Feb 88) / Rotate Source Code / rot2Edit ƒ / rot2Edit.p < prev    next >
Text File  |  1988-01-02  |  3KB  |  151 lines

  1. PROGRAM rot2Edit;
  2.  
  3. {
  4. ••••••••••••••••••••••••••••••••••
  5.     rot2Edit by John D. Olsen
  6.                 for
  7.         MacTutor Magazine
  8.             © Jan 1988
  9. ••••••••••••••••••••••••••••••••••
  10. }
  11.  
  12. uses
  13.     {$LOAD pinterfaces.dump}        
  14.     MemTypes,QuickDraw,OsIntf,PasLibIntf,
  15.     ToolIntf,PackIntf,IntEnv,CursorCtl;
  16.  
  17. type
  18.     integerPtr = ^INTEGER;
  19. var
  20.     item: Handle;
  21.     itemHit, invertItem : INTEGER;
  22.     map1, map2 : bitMap;
  23.     rect1, rect2 : rect;
  24.     
  25.     
  26. FUNCTION NewPtrClear( theSize: size ) : Ptr; EXTERNAL;
  27.     
  28. PROCEDURE Rotate( srcMap, destMap : BitMap ); EXTERNAL;
  29.     
  30. PROCEDURE NewBitMapClear( VAR theBitMap : BitMap );
  31.     BEGIN
  32.     WITH theBitMap, bounds DO
  33.         BEGIN
  34.             rowBytes := ((right - left + 15) DIV 16) * 2;
  35.             baseAddr := NewPtrClear(rowBytes * (bottom - top));
  36.             IF MemError <> noErr then baseAddr := NIL;
  37.         END;
  38.     END;
  39.         
  40.  
  41.  
  42. FUNCTION filterProc(theDialog: DialogPtr; VAR theEvent: EventRecord; VAR itemHit: INTEGER): BOOLEAN;
  43.         CONST
  44.             EnterKey = $03;
  45.             BackspaceKey = $08;
  46.             TabKey = $09;
  47.             ReturnKey = $0D;
  48.             ClearKey = $1B;
  49.             DeleteKey = $7F;
  50.  
  51.             {bits of the event modifiers long word}
  52.             CommandBit = 8;
  53.  
  54.     VAR
  55.         itemNum: INTEGER;
  56.         kind: INTEGER;
  57.         box: Rect;
  58.         charCode: INTEGER;
  59.         theChar: Char;
  60.         dialog: DialogPtr;
  61.  
  62. VAR
  63.     noteDialog : DialogPtr;
  64.     itemType : integer;
  65.  
  66.     BEGIN
  67.     filterProc := FALSE;
  68.  
  69.     CASE theEvent.what OF
  70.         nullEvent:
  71.             BEGIN    { 2, 3 }
  72.                 GetDItem(theDialog, 2, kind, item, box);
  73.                 GetDItem(theDialog, 3, kind, item, rect2);
  74.                 CopyBits( thePort^.portBits, map1, box, map1.bounds, srcCopy, nil);
  75.                 Rotate( map1, map2 );
  76.                 CopyBits( map2, thePort^.portBits, map2.bounds, rect2, srcCopy, nil);
  77.                 DisposPtr( map2.baseAddr );
  78.             END;
  79.         keyDown, autoKey:
  80.             BEGIN
  81.             charCode := BAND(theEvent.message, charCodeMask);
  82.             IF charCode IN [EnterKey] THEN 
  83.                 BEGIN    
  84.                 itemHit := 1;
  85.                 filterProc := true;
  86.                 EXIT(filterProc);
  87.                 END;
  88.             IF charCode IN [ClearKey] THEN
  89.                 BEGIN
  90.                 IF theEvent.what = keyDown THEN DlgDelete(theDialog);
  91.                 theEvent.what := nullEvent;
  92.                 EXIT(filterProc)
  93.                 END;
  94.             IF BTST(theEvent.modifiers, CommandBit) THEN
  95.                 BEGIN
  96.                 theChar := CHR(charCode);
  97.                 CASE theChar OF
  98.                     'X','x': IF theEvent.what = keyDown THEN DlgCut(theDialog);
  99.                     'C','c': IF theEvent.what = keyDown THEN DlgCopy(theDialog);
  100.                     'V','v': IF theEvent.what = keyDown THEN DlgPaste(theDialog);
  101.                     OTHERWISE ;
  102.                 END;
  103.                 theEvent.what := nullEvent;
  104.                 EXIT(filterProc);
  105.                 END;
  106.             END;
  107.     END;
  108.     END;
  109.  
  110. PROCEDURE EditThatSucker;
  111. type
  112.     strHandle = ^strPtr;
  113.     strPtr = ^Str255;
  114. var
  115.     noteDialog : DialogPtr;
  116.     itemType : integer;
  117.     item : handle;
  118.     box : rect;
  119. BEGIN
  120. {Bring up the window}
  121.     noteDialog := GetNewDialog( 1000, NIL, windowPtr(-1) );
  122.     showWindow(noteDialog);
  123.     SetPort(noteDialog);
  124.  
  125.     getDItem(noteDialog, 2, itemType, item, box);
  126.     map1.bounds := box;
  127.     NewBitMapClear( map1 );
  128.     
  129.     
  130.     InitCursor;
  131.     repeat
  132.         ModalDialog(@filterProc, itemHit);
  133.     until itemHit = 1;
  134.     
  135.     DisposDialog(noteDialog);
  136. END;{EditThatSucker}
  137.  
  138. BEGIN {main}
  139.     InitGraf(@thePort);
  140.     BEGIN
  141.         InitFonts;
  142.         InitWindows;
  143.         InitMenus;
  144.         TEInit;
  145.         InitDialogs(nil);
  146.     END;
  147.  
  148.     invertItem := 1;
  149.     EditThatSucker;
  150.     
  151. END.